﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ListaDeContatos
{
    class Program
    {
        static void Main(string[] args)
        {
            MenuPrincipal();
        }

        static void MenuPrincipal()
        {
            string Opc;
            do
            {
                Console.Clear();
                Console.WriteLine("Bem vindo a lista de contatos\nO que você deseja fazer?\nDigite \n1 - para inserir um novo contato \n2 - para listar os contatos\n3 - Para sair");
                Opc = Console.ReadLine();
                switch (Opc)
                {
                    case "1":
                        InserirContato();
                        break;
                    case "2":
                        ListarContatos();
                        break;
                    case "3":
                        Environment.Exit(0);
                        break;
                    default:
                        Console.Clear();
                        Console.WriteLine("A opção escolhida não e valida digite enter para continuar");
                        Console.ReadKey();
                        Console.Clear();
                        MenuPrincipal();
                        break;
                }
            } while ((Opc != "1") || (Opc != "2") || (Opc != "3"));
        }

        static void InserirContato()
        {
            Console.Clear();
            string arquivo = Directory.GetCurrentDirectory() + "\\lista.txt";
            StreamWriter escrita = new StreamWriter(arquivo, true);
            string VariaveldeSaida = "", nome, telefone, email;
            do
            {
                Console.Clear();
                Console.WriteLine("Digite o Nome");
                nome = Console.ReadLine();
                if (nome == "")
                {
                    Console.Clear();
                    Console.WriteLine("Nome invalido tecle enter para digitar um nome valido");
                    Console.ReadKey(); 
                }
            } while (nome == "");
            do
            {
                Console.Clear();
                Console.WriteLine("Digite o Telefone");
                telefone = Console.ReadLine();
                if (telefone == "")
                {
                    Console.Clear();
                    Console.WriteLine("telefone invalido tecle enter para digitar um telefone valido");
                    Console.ReadKey();
                }
            } while (telefone == "");
            do
            {
                Console.Clear();
                Console.WriteLine("Digite o Email");
                email = Console.ReadLine();
                if (email == "")
                {
                    Console.Clear();
                    Console.WriteLine("Email invalido tecle enter para digitar um email valido");
                    Console.ReadKey();
                }
            } while (email == "");
            escrita.WriteLine(nome);
            escrita.WriteLine(telefone);
            escrita.WriteLine(email);
            escrita.Close();
            while ((VariaveldeSaida != "s") || (VariaveldeSaida != "S") || (VariaveldeSaida != "n") || (VariaveldeSaida != "N"))
            {
                Console.Clear();
                Console.WriteLine("Digitar outro contato?\nDigite\nS- para sim\nN- para não");
                VariaveldeSaida = Console.ReadLine();
                if ((VariaveldeSaida == "s") || (VariaveldeSaida == "S"))
                {
                    InserirContato();
                }
                else if ((VariaveldeSaida == "n") || (VariaveldeSaida == "N"))
                {
                    MenuPrincipal();
                }
                else
                {
                    Console.Clear();
                    Console.WriteLine("A opção escolhida não e valida digite qualquer tecla para continuar para continuar");
                    Console.ReadKey();
                    Console.Clear();
                }
            }
        }

        static void ListarContatos()
        {
            string arquivo = Directory.GetCurrentDirectory() + "\\lista.txt";
            Console.Clear();
            try
            {
                StreamReader testeleitura = new StreamReader(arquivo);
                testeleitura.Close();
            }
            catch
            {
                Console.WriteLine("não existe nenhum contato!\nDigite enter para continuar.");
                Console.ReadKey();
                MenuPrincipal();
            }
            StreamReader leitura = new StreamReader(arquivo);
            int TamanhoArray = 1000;
            string[] lista = new string[TamanhoArray];
            Console.WriteLine("Como deseja listar os contatos?\nDigite\n1 - para listar tudo\n2 - para listar Nome e Telefone\n3 - para listar Nome e E-mail\n4 - Voltar ao Menu Principal");
            string OpcListar = Console.ReadLine();
            switch (OpcListar)
            {
                case "1":
                    #region
                    Console.Clear();
                    for (int a = 0; a < TamanhoArray; a++)
                    {
                        string Nome = leitura.ReadLine();
                        string telefone = leitura.ReadLine();
                        string Email = leitura.ReadLine();
                        if (Nome != null)
                        {
                            lista[a] = Nome + "  -  " + telefone + "  -  " + Email;
                        }
                    }
                    leitura.Close();
                    Console.WriteLine("Digite\n1 - para listar tudo\n2 - para listar tudo em ordem crescente\n3 - para listar tudo em ordem decrescente");
                    OpcListar = Console.ReadLine();
                    switch (OpcListar)
                    {
                        case "1":
                            ListarTudo(lista);
                            break;
                        case "2":
                            OrdenacaoCrescente(lista);
                            break;
                        case "3":
                            OrdenacaoDecrescente(lista);
                            break;
                        default:
                            Console.Clear();
                            Console.WriteLine("A opção escolhida não e valida digite enter para continuar");
                            Console.ReadKey();
                            Console.Clear();
                            ListarContatos();
                            break;
                    }
                    #endregion
                    break;
                case "2":
                    #region
                    Console.Clear();
                    for (int a = 0; a < TamanhoArray; a++)
                    {
                        string Nome = leitura.ReadLine();
                        string telefone = leitura.ReadLine();
                        string Email = leitura.ReadLine();
                        if (Nome != null)
                            lista[a] = Nome + "  -  " + telefone;
                    }
                    leitura.Close();
                    Console.WriteLine("Digite\n1 - para listar tudo somente Nome e Telefone\n2 - para listar somente Nome e Telefone em ordem crescente\n3 - para listar somente Nome e Telefone em ordem decrescente");
                    OpcListar = Console.ReadLine();
                    switch (OpcListar)
                    {
                        case "1":
                            ListarTudo(lista);
                            break;
                        case "2":
                            OrdenacaoCrescente(lista);
                            break;
                        case "3":
                            OrdenacaoDecrescente(lista);
                            break;
                        default:
                            Console.Clear();
                            Console.WriteLine("A opção escolhida não e valida digite enter para continuar");
                            Console.ReadKey();
                            Console.Clear();
                            ListarContatos();
                            break;
                    }
                    #endregion
                    break;
                case "3":
                    #region
                    Console.Clear();
                    for (int a = 0; a < TamanhoArray; a++)
                    {
                        string Nome = leitura.ReadLine();
                        string telefone = leitura.ReadLine();
                        string Email = leitura.ReadLine();
                        if (Nome != null)
                            lista[a] = Nome + "  -  " + Email;
                    }
                    leitura.Close();
                    Console.WriteLine("Digite\n1 - para listar tudo somente Nome e E-mail\n2 - para listar somente Nome e E-mail em ordem crescente\n3 - para listar somente Nome e E-mail em ordem decrescente");
                    OpcListar = Console.ReadLine();
                    switch (OpcListar)
                    {
                        case "1":
                            ListarTudo(lista);
                            break;
                        case "2":
                            OrdenacaoCrescente(lista);
                            break;
                        case "3":
                            OrdenacaoDecrescente(lista);
                            break;
                        default:
                            Console.Clear();
                            Console.WriteLine("A opção escolhida não e valida digite enter para continuar");
                            Console.ReadKey();
                            Console.Clear();
                            ListarContatos();
                            break;
                    }
                    #endregion
                    break;
                case "4":
                    Console.Clear();
                    leitura.Close();
                    MenuPrincipal();
                    break;
                default:
                    Console.Clear();
                    Console.WriteLine("A opção escolhida não e valida digite enter para continuar");
                    Console.ReadKey();
                    Console.Clear();
                    ListarContatos();
                    break;
            }
        }

        static void ListarTudo(string[] lista)
        {
            Console.Clear();
            for (int b = 0; b < lista.Length; b++)
            {
                if (lista[b] != null)
                    Console.WriteLine(lista[b]);
            }
            Console.ReadKey();
            ListarContatos();
        }

        static void OrdenacaoCrescente(string [] lista)
        {
            Console.Clear();
            for (int i = 0; i < lista.Length; i++)
            {
                for (int j = 0; j < lista.Length; j++)
                {
                    if (String.Compare(lista[i], lista[j]) < 0)
                    {
                        string swap = lista[i];
                        lista[i] = lista[j];
                        lista[j] = swap;
                    }
                }
            }
            for (int b = 0; b < lista.Length; b++)
            {
                if (lista[b] != null)
                    Console.WriteLine(lista[b]);
            }
            Console.ReadKey();
            ListarContatos();
        }

        static void OrdenacaoDecrescente(string[] lista)
        {
            Console.Clear();
            for (int i = 0; i < lista.Length; i++)
            {
                for (int j = 0; j < lista.Length; j++)
                {
                    if (String.Compare(lista[i], lista[j]) > 0)
                    {
                        string swap = lista[i];
                        lista[i] = lista[j];
                        lista[j] = swap;
                    }
                }
            }
            for (int b = 0; b < lista.Length; b++)
            {
                if (lista[b] != null)
                    Console.WriteLine(lista[b]);
            }
            Console.ReadKey();
            ListarContatos();
        }
    }
}

